home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / biz / dopus / empDopus.lha / empDopus_r1.1.lha / Source / emp_playdt.dopus5 < prev    next >
Text File  |  1997-10-20  |  14KB  |  438 lines

  1. /*$VER: emp_PlayDT.dopus5 1.1 (20.10.97) B00ze
  2.  * For questions or comments email Booze@Videotron.CA
  3.  *
  4.  * Mod-Player interface for Directory Opus 5.5 and Delitracker,
  5.  * Based on Deliplay (C module).
  6.  *
  7.  * This version differs with Leo's PlaymodDT in that it builds a modlist
  8.  * and passes THAT to Delitracker, so you don't have a "continue" requester
  9.  * anymore.  It'll also work from any lister, provided you call it from a
  10.  * lister toolbar (we always get passed the lister's handle in that case).
  11.  *
  12.  * This one is also in the form of a MODULE (less overhead), and gives you
  13.  * additional commands like "DTStop" and "DTShow" etc...  I was forced to
  14.  * do this script because DeliPlay, the C module, waits forever before
  15.  * it releases the lister (it inserts the files into the playlist 1 at a
  16.  * time and has to wait for the damn port because of that, annoying).
  17.  *
  18.  * If the player's ARexx port is not found, the program will be run for
  19.  * you (you MUST provide the path to the Delitracker executable in the
  20.  * call to this script) .  This means the script may fail if you disable
  21.  * the player's ARexx port, or give an incorrect command line to it.  If
  22.  * the ARexx port takes more than 10 seconds to appear, an error requester
  23.  * will appear on the DOpus screen and the script will quit.
  24.  *
  25.  * USAGE:
  26.  *
  27.  *  All commands but one are called with no parameter; the PLAY command
  28.  *  needs to be given the Delitracker2 path/execname within dquotes and
  29.  *  can be passed 1 startup option, whatever else follows is passed on
  30.  *  to the delitracker executable (WHEN FIRST STARTED only though!):
  31.  *
  32.  *  PlayDT_Play "PathToDelitracker2Exec/ExecName" [Option] [DTStartupOptions]
  33.  *
  34.  *  Examples:
  35.  *
  36.  *   1- Start Delitracker, no selected files, filter on, and hide the GUI:
  37.  *
  38.  *        PlayDT_Play "WORK:Soundp/Delitracker2" HIDEDT filter=yes
  39.  *
  40.  *   2- Play the selected tunes, and show the GUI:
  41.  *
  42.  *        PlayDT_Play "WORK:Soundp/Delitracker2" SHOWDT
  43.  *
  44.  * NOTES
  45.  *
  46.  *     -You can't play directories - but that's easy to change if needed,
  47.  *
  48.  *     -Calling us with no selected files just tries to run Delitracker,
  49.  *
  50.  *     -WHEN STARTED, we give DT Dopus's screename, so it'll popup there.
  51.  *
  52.  *     -There is a "hardwired" "fade" of 1 second for playlists - It is
  53.  *      in the form of a variable so you can change it below, but you do
  54.  *      have to do some editing...
  55.  *
  56.  *     -When specifying Delitracker's path/execname, it NEEDS to have a
  57.  *      path! We need to know its root directory so that it can find its
  58.  *      subdirectories (so a resident Delitracker won't do).
  59.  *
  60.  *     -Some S3M modules (or some version of the S3M player) do not handle
  61.  *      the SongEnd event properly; if you play a bunch of these, the
  62.  *      modlist may "jam" on a certain S3M and keep playing it until
  63.  *      you force it to move on, it ain't this script's fault.
  64.  *
  65.  * PROGRAM HISTORY
  66.  *
  67.  *  v1.0 -Made into a MODULE,
  68.  *     -Changed the lister searches,
  69.  *     -Sends the list of selected files as a modulelist,
  70.  *     -More commands and options, even pass startup options to DT!
  71.  *     -Uses DT.cfg in Dopus/Settings WHEN STARTING DT (copy your own there),
  72.  *     -Releases the lister almost immediately - hurray!
  73.  *
  74.  *  v1.1 -Improved signal traps.
  75.  *     -Made a bunch of code into functions.
  76.  *     -Requesters will be centered on the lister window whenever possible.
  77.  *     -Amount of FADE for modlists can now be "configured" at the top
  78.  *      of this script via the variable dtFade.
  79.  *
  80.  */
  81.  
  82.  
  83. dtConfig='Config=Dopus5:Settings/DT.cfg'                /* Only used if WE loadup DT    */
  84. dtSettings='Playstart=NO Quickstart=YES CX_Popup=NO Activate=NO'    /* Idle start options        */
  85. dtFade=1                                /* Time to fade the playlists    */
  86.  
  87. PN='PlayDT.dopus5'
  88. SH=0;WIN=0;LF='0A'x /* These are globals needed by almost every function I use! */
  89.  
  90. Options results
  91. Signal ON SYNTAX
  92. Signal ON BREAK_C
  93. Signal ON FAILURE
  94. Signal ON IOERR
  95.  
  96. Parse ARG P F SH DH A
  97. Address VALUE P
  98.  
  99. /* Initialization */
  100.  
  101.  F=Upper(F)
  102.  If F='INIT' Then Do
  103.    'Dopus Command PlayDT_Play  Program emp_playdt Desc "Play Module(s)" Template "DT2Execname/A (Use quotes!),HideDT/S,ShowDT/S,DT2StartupOptions..." SOURCE'
  104.    'Dopus Command PlayDT_Stop  Program emp_playdt Desc "Stop Playing"'
  105.    'Dopus Command PlayDT_Show  Program emp_playdt Desc "Show Delitracker"'
  106.    'Dopus Command PlayDT_Hide  Program emp_playdt Desc "Hide Delitracker"'
  107.    'Dopus Command PlayDT_Quit  Program emp_playdt Desc "Quit Delitracker"'
  108.    'Dopus Command PlayDT_Pause Program emp_playdt Desc "Pause playing"'
  109.    'Dopus Command PlayDT_Next  Program emp_playdt Desc "Skip to next song"'
  110.    'Dopus Command PlayDT_Prev  Program emp_playdt Desc "Skip to previous song"'
  111.     Exit 0
  112.  End
  113.  
  114. /* MAIN */
  115.  
  116.  Options failat 21
  117.  
  118.  Select
  119.     When F='PLAYDT_PLAY'  Then Call DTPLAY
  120.  
  121.     When F='PLAYDT_STOP'  Then If Show('P',"DELITRACKER") Then Do
  122.        Address 'DELITRACKER'
  123.       'Fadeout 0'
  124.       'Clearlist'
  125.        /* Address VALUE P */
  126.        End
  127.  
  128.     When F='PLAYDT_SHOW'  Then If Show('P',"DELITRACKER") Then Address 'DELITRACKER' 'ShowGUI'
  129.     When F='PLAYDT_HIDE'  Then If Show('P',"DELITRACKER") Then Address 'DELITRACKER' 'HideGUI'
  130.     When F='PLAYDT_QUIT'  Then If Show('P',"DELITRACKER") Then Address 'DELITRACKER' 'Quit'
  131.     When F='PLAYDT_PAUSE' Then If Show('P',"DELITRACKER") Then Address 'DELITRACKER' 'Playpause'
  132.     When F='PLAYDT_NEXT'  Then If Show('P',"DELITRACKER") Then Address 'DELITRACKER' 'Nextsong'
  133.     When F='PLAYDT_PREV'  Then If Show('P',"DELITRACKER") Then Address 'DELITRACKER' 'Prevsong'
  134.  
  135.     Otherwise NOP
  136.  End
  137.  Exit 0
  138.  
  139.       /*-----------------------------------------------------------
  140.                                 Play/START
  141.       -----------------------------------------------------------*/
  142.  
  143. DTPLAY:
  144.  
  145.    If ~GSL() Then Call ReqERR('No Source Lister To Work With!') /* First, let's see if we got a lister to work with */
  146.  
  147.    dtExec=GARGS() /* Parse execname and other arguments */
  148.  
  149.    Call GFILES()
  150.  
  151.   'Lister Set' SH 'Busy 0' /* We're done with the lister, free the fucker */
  152.  
  153.    If ~RunDT() Then Call ReqERR('Unable to Run/Locate DeliTracker!')
  154.  
  155.    If FL.count=0 Then Exit 0 /* We're done */
  156.  
  157.    Address 'DELITRACKER'
  158.    If FL.count=1 Then 'Songend NO'
  159.    Else Do
  160.      'Songend YES'
  161.      'Fadeout 'dtFade
  162.    End
  163.  
  164.    Options failat 30;'Playmod 'FN;Options failat 21
  165.    If RC~=0 Then Call ReqERR('Delitracker was unable to play the selected file(s).')
  166.  
  167.    Address VALUE P
  168.    If FL.count>1 Then 'Command Delete "'FN'" QUIET'
  169.    Return(1)
  170.  
  171.       /*-----------------------------------------------------------
  172.              GARGS - Parse args for Delitracker path/execname
  173.       -----------------------------------------------------------*/
  174.  
  175. GARGS:
  176.  
  177.    Parse VAR A '"' nam '"' A
  178.  
  179.    nam=Strip(nam,'B')
  180.    If nam="" Then Call ReqERR('You MUST pass PLAY the path/name of the Delitracker'LF'executable, within double quotes.')
  181.    If ~Exists(nam) Then Call ReqERR('Unable to locate the Delitracker executable:'LF||nam)
  182.  
  183.    tmp=Left(nam,Max(Lastpos(':',nam),(Lastpos('/',nam)))) /* Neat path trick by Timo */
  184.  
  185.    Call Pragma('D',tmp) /* We need this for relative pathnames in DT's config */
  186.  
  187.   /* Now see if we were also passed an arg, and leave what's left to delitracker */
  188.  
  189.    A=Strip(A,'B')
  190.    If A~="" Then Do
  191.       Parse VAR A tmp A
  192.       tmp=Upper(tmp)
  193.       If tmp="SHOWDT"|tmp="HIDEDT" Then dtGUI=tmp
  194.       Else Do
  195.          dtGUI="NA"
  196.          A=' 'tmp||A /* Return to Ceasar what is Ceasar's */
  197.       End
  198.    End
  199.  
  200.   'Dopus Screen'
  201.    Parse VAR RESULT S .
  202.    Return('RUN <NIL: >NIL: "'nam'" 'dtConfig' Pubscreen="'S'" 'dtSettings||A)
  203.  
  204.  
  205.       /*-----------------------------------------------------------
  206.                       RunDT - Run and/or Show/Hide DT
  207.       -----------------------------------------------------------*/
  208.  
  209. RUNDT:
  210.  
  211.    If ~Show('P',"DELITRACKER") Then Do
  212.        Address COMMAND dtExec
  213.        Address COMMAND 'C:WaitForPort DELITRACKER'
  214.  
  215.        If ~Show('P',P) Then Exit 21 /* Dopus is gone?! */
  216.        If ~Show('P',"DELITRACKER") Then Return(0)
  217.  
  218.    End
  219.    Address 'DELITRACKER'
  220.    Select
  221.       When dtGUI="HIDEDT" Then Do
  222.           'Status G GUI'
  223.            If Upper(RESULT)='YES' Then 'HideGUI'
  224.       End
  225.       When dtGUI="SHOWDT" Then Do
  226.           'Status G GUI'
  227.            If Upper(RESULT)='NO' Then 'ShowGUI'
  228.       End
  229.       Otherwise NOP
  230.    End
  231.    If FL.count~=0 Then Do
  232.      'Fadeout 0'
  233.      'Clearlist'
  234.    End
  235.    Return(1)
  236.  
  237.       /*-----------------------------------------------------------
  238.                         GFILES - Build the MODLIST
  239.       -----------------------------------------------------------*/
  240.  
  241. GFILES:
  242.  
  243.    FL.=0
  244.   'Lister Query' SH 'Numselfiles'
  245.    If RESULT=0|RESULT="RESULT" Then Return(1) /* Nothing to play */
  246.  
  247.    LP=GLP(SH) /* Get terminated lister path */
  248.  
  249.   /* Get the array of selected files */
  250.  
  251.   'Lister Query' SH 'Selfiles Stem FL.'
  252.    If FL.count=0 Then Call ReqERR('Unable To Obtain List Of Selected Files!') /* We tested for files before, not good */
  253.   
  254.   /* Open the MODLIST file we pass to Delitracker, if more than 1 entry */
  255.  
  256.    If FL.count=1 Then Do
  257.       FN=LP||FL.0 /* We'll check later to see if we got more than 1 entry and set the appropriate options */
  258.      'Lister Select' SH '"'FL.0'" 0'
  259.       End
  260.    Else Do
  261.       FN='T:PlayDT.'Pragma('ID')'.tmp'
  262.       IF ~Open('L',FN,'W') Then Call ReqERR('Unable To Open ModList File!')
  263.  
  264.      /* Save all selected entries in the SH lister to the file and deselect */
  265.  
  266.       Call WriteLN('L','MODLIST')
  267.       Do x=0 To FL.count-1
  268.          Call WriteLN('L',LP||FL.x)
  269.         'Lister Select' SH '"'FL.x'" 0'
  270.       End
  271.    End
  272.  
  273.   'Lister Refresh' SH
  274.  
  275.    If FL.count>1 Then If ~Close('L') Then Call ReqERR('Unable To Close MODLIST File!')
  276.  
  277.    Return(1)
  278.  
  279.       /*-----------------------------------------------------------
  280.                              Get Source Lister
  281.                   You MUST Initialise WIN and SH to Zer0!
  282.       -----------------------------------------------------------*/
  283.  
  284. /* Returns the GLOBALS SH and WIN, the idea being that all requesters
  285.  * should appear within the calling window.  When SH is already set to
  286.  * a non-zero numeric value, we assume we've parsed a valid {Ql} arg.
  287.  *
  288.  * When SH is zero, we query Dopus for a SOURCE-Lister.  If we are
  289.  * passed 'D' we try for a DEST-Lister when no SOURCE-Lister can be
  290.  * obtained.  If we are passed 'A' we try for that when DEST fails. */
  291.  
  292. GSL: PROCEDURE EXPOSE P LF PN SH WIN /* USAGE: Success=GSL(Scantype) */
  293.  
  294.    If Datatype(SH)~="NUM" Then Call ReqERR('UnInitialized SH/SourceHandle!')
  295.  
  296.    If SH=0 Then Do
  297.  
  298.       Parse UPPER ARG STyp
  299.       If STyp~="D"|STyp~="A" Then STyp="S"
  300.  
  301.       SL.=0
  302.      'Lister Query Source Stem SL.'
  303.       If SL.count=0 Then If STyp="S" Then Return(0)
  304.          Else Do
  305.            'Lister Query Dest Stem SL.'
  306.             If SL.count=0 Then If STyp="D" Then Return(0)
  307.                Else Do
  308.                  'Lister Query ALL Stem SL.'
  309.                   If SL.count=0 Then Return(0)
  310.                End
  311.          End
  312.  
  313.       SH=SL.0
  314.    End
  315.  
  316.   'Lister Set' SH 'Source'
  317.   'Lister Query' SH 'Window'
  318.    If RESULT~=0&Datatype(RESULT)='NUM' Then WIN=RESULT
  319.    Else WIN=0
  320.    Return(1)
  321.  
  322.       /*-----------------------------------------------------------
  323.                         Get Terminated Lister Path
  324.       -----------------------------------------------------------*/
  325.  
  326. GLP: PROCEDURE EXPOSE P LF PN SH WIN /* USAGE: Path=GLP(ListerHandle) */
  327.  
  328.    Parse ARG LH
  329.   'Lister Query' LH 'PATH'
  330.    If RESULT=""|RESULT="RESULT" Then Call ReqERR('Unable To Obtain Lister PATH!')
  331.    Else Do
  332.       LP=RESULT
  333.       If Right(LP,1)~=':'&Right(LP,1)~='/' Then LP=LP'/'
  334.    End
  335.    Return(LP)
  336.  
  337.       /*-----------------------------------------------------------
  338.                                 Requesters
  339.             All functions assume the current port to be Dopus's
  340.       -----------------------------------------------------------*/
  341.  
  342. /* All requesters work on the calling lister, specified by the globals
  343.  * SH/WIN, when set.  To force a lister to appear centered on the dopus
  344.  * screen instead, supply the extra switch 'NW' for 'NoWin-Centered' */
  345.  
  346. ReqERR: PROCEDURE EXPOSE P LF PN SH WIN /* USAGE: GReqERR('requestertext'[,'NW']) - Quits! */
  347.  
  348.    Parse ARG TXT,A
  349.    A=Upper(A)
  350.  
  351.   'Command Flash'
  352.    If ~Show('L',"rexxreqtools.library") Then CALL AddLib('rexxreqtools.library',0,-30,0) /* Try to get rexxreqtools loaded */
  353.    If ~Show('L',"rexxreqtools.library") Then Do
  354.        If SH=0|Datatype(SH)~="NUM"|A="NW" Then RCMD='Dopus Request'
  355.        Else RCMD='Lister Request 'SH
  356.        RCMD' "+++ 'PN' Error +++'LF||TXT'" OK'
  357.    End
  358.    Else Do
  359.       If WIN=0|Datatype(WIN)~="NUM"|A="NW" Then Do
  360.         'Dopus Screen'
  361.          Parse VAR RESULT S .
  362.          RTAG='RT_PubScrName='S' rt_reqpos=reqpos_centerscr'
  363.          End
  364.       Else RTAG='RT_Window='WIN' rt_reqpos=reqpos_centerwin'
  365.       CALL rtEZRequest('+++ 'PN' Error +++'LF||TXT,,PN,RTAG' rtez_flags=ezreqf_centertext rt_idcmpflags=idcmp_vanillakey')
  366.    End
  367.    If SH~=0 Then Do
  368.      'Lister Set' SH 'Busy 0'
  369.      'Lister Set' SH 'Title'
  370.      'Lister Refresh' SH 'FULL'
  371.    End
  372.    Exit 20
  373.  
  374.       /*-----------------------------------------------------------
  375.                                ERROR HANDLERS
  376.       -----------------------------------------------------------*/
  377.  
  378. BREAK_C:
  379.  
  380.    Address VALUE P
  381.    If SH~=0 Then Do
  382.      'Lister Set' SH 'Busy 0'
  383.      'Lister Set' SH 'Title'
  384.      'Lister Refresh' SH 'FULL'
  385.       RCMD='Lister Request 'SH
  386.       End
  387.    Else RCMD='Dopus Request'
  388.   'Command Flash'
  389.    RCMD' "+++ Break! +++" OK'
  390.    Call Close('L')
  391.    Exit 0
  392.  
  393. SYNTAX:
  394.  
  395.    RCX=RC
  396.    Address VALUE P
  397.    If SH~=0 Then Do
  398.      'Lister Set' SH 'Busy 0'
  399.      'Lister Set' SH 'Title'
  400.      'Lister Refresh' SH 'FULL'
  401.       RCMD='Lister Request 'SH
  402.       End
  403.    Else RCMD='Dopus Request'
  404.   'Command Flash'
  405.    RCMD' "+++ Syntax Error +++'LF'('RCX') at line 'SIGL||LF||errortext(RCX)'" OK'
  406.    Call Close('L')
  407.    Exit 20
  408.  
  409. FAILURE:
  410.  
  411.    Address VALUE P
  412.    If SH~=0 Then Do
  413.      'Lister Set' SH 'Busy 0'
  414.      'Lister Set' SH 'Title'
  415.      'Lister Refresh' SH 'FULL'
  416.       RCMD='Lister Request 'SH
  417.       End
  418.    Else RCMD='Dopus Request'
  419.   'Command Flash'
  420.    RCMD' "+++ Failure +++'LF'Something failed at line 'SIGL'" OK'
  421.    Call Close('L')
  422.    Exit 20
  423.  
  424. IOERR:
  425.  
  426.    Address VALUE P
  427.    If SH~=0 Then Do
  428.      'Lister Set' SH 'Busy 0'
  429.      'Lister Set' SH 'Title'
  430.      'Lister Refresh' SH 'FULL'
  431.       RCMD='Lister Request 'SH
  432.       End
  433.    Else RCMD='Dopus Request'
  434.   'Command Flash'
  435.    RCMD' "+++ I/O Error +++'LF'I/O Operation failed at line 'SIGL'" OK'
  436.    Call Close('L')
  437.    Exit 20
  438.